package misp_backend.service.impl;

import lombok.RequiredArgsConstructor;
import misp_backend.domain.KitchenTaskDTO;
import misp_backend.domain.OrderDetailWithOrder;
import misp_backend.domain.Orderdetails;
import misp_backend.domain.Table;
import misp_backend.mapper.OrderdetailsMapper;
import misp_backend.service.KitchenService;
import misp_backend.service.TableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class KitchenServiceImpl implements KitchenService {
    // 注入订单明细Mapper组件，用于数据库操作
    private final OrderdetailsMapper orderdetailsMapper;
    @Autowired
    private TableService tableService;

    /**
     * 获取待处理的后厨任务（按菜品类别分组）
     * @return 按菜品类别分组后的厨房任务DTO列表
     */
    @Override
    public List<KitchenTaskDTO> getPendingTasks() {

        List<OrderDetailWithOrder> details = orderdetailsMapper.selectDetailsWithOrders();


        // 2. 使用流式处理进行数据转换和分组
        return details.stream()
                // 过滤无效数据：排除无菜品信息或分类信息的订单明细
                .filter(d -> d.getDish() != null && d.getDish().getCategory() != null)
                // 3. 按菜品分类ID进行分组（key=分类ID，value=该分类下的任务项列表）
                .collect(Collectors.groupingBy(
                        d -> d.getDish().getCategory().getCategoryId(),
                        // 将每个订单明细转换为任务项对象
                        Collectors.mapping(this::convertToTaskItem, Collectors.toList())
                ))
                // 4. 将分组后的Map转换为DTO流
                .entrySet().stream()
                // 将每个分组条目转换为KitchenTaskDTO对象
                .map(entry -> new KitchenTaskDTO()
                        // 设置分类ID
                        .setCategoryId(entry.getKey())
                        // 从第一个任务项中获取分类名称（所有同组项共享相同分类）
                        .setCategoryName(entry.getValue().get(0).getCategoryName())
                        // 设置该分类下的任务项列表
                        .setItems(entry.getValue()))
                // 5. 按每个分类中最早的任务创建时间排序（保持原始下单顺序）
                .sorted(Comparator.comparing(dto -> dto.getItems().get(0).getCreateTime()))
                // 6. 将流收集为最终列表
                .collect(Collectors.toList());
    }

    /**
     * 将订单明细对象转换为任务项DTO
     * @param detail 订单明细对象（包含关联数据）
     * @return 厨房任务项DTO
     */
    private KitchenTaskDTO.TaskItem convertToTaskItem(OrderDetailWithOrder detail) {
        Table table=tableService.getById(detail.getTableId());
        KitchenTaskDTO.TaskItem taskItem=new KitchenTaskDTO.TaskItem();
        taskItem.setOrderDetailId(detail.getOrderdetailId());
        taskItem.setSpecs(detail.getSpecs());
        taskItem.setQuantity(detail.getQuantity());
        taskItem.setCreateTime(detail.getCreateTime());
        taskItem.setTableName(table.getTableName());
        taskItem.setDishName(detail.getDish().getDishName());
        taskItem.setDescription(detail.getDescription());
        taskItem.setCategoryName(detail.getDish().getCategory().getCategoryName());
        return taskItem;
    }
   public boolean updateStatus(Long detailId, int newStatus){
       Orderdetails detail = new Orderdetails();
       detail.setOrderdetailId(detailId);
       detail.setStatus(newStatus);
       orderdetailsMapper.updateById(detail);
       return  true;
   }
}